/**
* \file		SousArbre.h
* \brief	Définit la structure SousArbre
* \details	C'est ici que sont définis la structure SousArbre, ses
*		accesseurs, ses mutateurs, ses fonctions diverses. Un
*		"SousArbre" étant un élément constitué de plusieurs branches.
*		L'ensemble des sous-arbres formera l'arbre des technologies du
*		jeu.
*/

#ifndef SOUSARBRE_H
#define SOUSARBRE_H

#include "Technologie.h"


/**
* \brief	Informations définissant un Sous-Arbre de l'arbre des
		technologies
* \details	Structure comprenant un tableau de pointeurs pointant sur le
		premier élément du sous-arbre de technologies, ainsi que le
		nombre de branches qu'il comporte.
*/

typedef struct
{
   int nbBranches;		/*!<nombre de branches du sous-arbre */
   Technologie **tabDeb;	/*!<tableau de pointeurs pointant sur la
				première technologie de chaque branche du sous-
				arbre*/
} SousArbre;

/*========================== Gestion de la mémoire ==========================*/

/**
* \brief	Initialise une structure SousArbre
* \details	Met l'entier à la valeur donnée et alloue la quantité de
*		mémoire nécessaire au tableau
* \param	pSA		Pointeur vers le sous-arbre à initialiser
* \param	nbBr		Nombre de branches qu'a le sous-arbre
*/
void initSousArbre(SousArbre *pSA, int nbBr);

/**
* \brief	Crée un SousArbre
* \details	Crée un SousArbre, réserve la mémoire nécessaire pour le
*		stocker dans le tas et l'initialise grâce à initTech.
* \param	ppSA		Pointeur sur adresse d'un sous-arbre donné
* \param	nbBr		Nombre de branches qu'a le sous-arbre
*/
void creerSousArbre(SousArbre **ppSA, int nbBr);

/**
* \brief	Libère la mémoire allouée pour les tableaux de la technologie
* \details	Met à NULL tous les Pointeurs, désalloue la mémoire réservée
*		initialement pour le tableau, met toutes les valeurs de la
*		structure passée en argument à leur valeur par défaut.
* \param	pSA		Pointeur vers le sous-arbre à libérer
*/
void libereSousArbre(SousArbre *pSA);

/**
* \brief	Libère la mémoire allouée pour un sous-arbre donné
* \param	pSA		Pointeur vers le sous-arbre à détruire
*/
void detruireSousArbre(SousArbre *pSA);

/*====================== Fonctions de Montage des SA ======================*/

/**
* \brief	Ajoute une technologie donnée à la tête d'un sous-arbre
* \details	Ajoute la technologie dont on aura fait passer le pointeur à
*		la tête de la branche adéquate (déterminée grâce à l'ID de la
*		technologie). Edite au passage le champ techSuiv.
* \param	pSA		Pointeur vers un sous-arbre
* \param	ptech		Pointeur vers la technologie à ajouter
*/
void ajouteTechBrancheSousArbre(SousArbre *pSA, Technologie *ptech);

/**
* \brief	Monte un sous-arbre à partir d'un fichier précédemment ouvert
* \details	Charge les différentes données contenues dans le fichier de
*		données et ajoute les technologies précédemment éditées en se
*		basant sur ces données au fur et à mesure, branche après
*		branche.
* \param	pSA		Pointeur vers l'adresse d'un sous-arbre
* \param	f		Pointeur sur le fichier à traiter (fichier
*				déjà ouvert en lecture)
*/
void creerDepuisFichierSousArbre(SousArbre **pSA, FILE *f);

/*============================= Accesseurs =============================*/
/**
* \brief	Retourne le nombre de branches d'un sous-arbre donné
* \return	Un entier
* \param	pSA		Pointeur vers un sous-arbre
*/
int getnbBranchesSousArbre(const SousArbre *pSA);

/**
* \brief	Retourne un pointeur vers la Technologie d'une ID donnée
* \details	Si l'ID donnée ne fait pas partie du sous-arbre donné, cette
*		fonction retournera NULL. Sinon, elle retournera un pointeur
*		sur la Technologie voulue.
* \return	Un pointeur vers une Technologie
* \param	pSA		Pointeur vers un sous-arbre
* \param	IDTech		ID de la Technologie à chercher
*/
Technologie *getTechSousArbre(const SousArbre *pSA, int IDTech);

/**
* \brief	Retourne un pointeur vers la première Technologie d'une
*		branche de sous-arbre donnée
* \details	Si la branche donnée existe dans le sous-arbre, renvoie un
*		pointeur vers la première Technologie de la branche en
*		question. Sinon, renvoie NULL.
* \return	Un pointeur vers une Technologie
* \param	pSA		Pointeur vers un sous-arbre
* \param	numBr		Numéro de la branche désirée
*/
Technologie *getDebBrancheSousArbre(const SousArbre *pSA, int numBr);

/*============================= Mutateurs =============================*/

/**
* \brief	Remplace le nombre de sous arbres par une valeur donnée
*		(supérieure ou égale à zéro)
* \param	pSA		Pointeur vers un sous-arbre
* \param	nouvNb		Valeur à affecter, entier
*/
void setNbBranchesSousArbre(SousArbre *pSA, int nouvNb);

/**
* \brief	Affecte à la ième case du tableau de pointeurs vers
*		technologie une valeur donnée
* \param	pSA		Pointeur vers un sous-arbre
* \param	nouvTech	Pointeur sur une technologie
* \param	numCase		Numéro de la case (en comptant à partir de
*				zéro) à affecter
*/
void setIemeTabDebSousArbre(SousArbre *pSA, Technologie *nouvTech, int numCase);

/*=========================== Fonctions de Test ===========================*/
/**
* \brief	Accède à tous les champs de toutes les technologies d'un arbre
*		donné.
* \param	pSA		Pointeur vers un sous-arbre
*/
void testTousChampsTechAccessibles(const SousArbre *pSA);

/**
* \brief	Teste les différentes fonctions du module SousArbre
* \details	Teste les différentes fonctions du module SousArbre en les
*		utilisant avec diverses valeurs plus ou moins probables
*/
void testSousArbre();




/* à supprimer */ 
void affSousArbre(SousArbre *pSA);

#endif
